////////////////////////////////////////////////////////////////////
// Programme de modification IPS pour Chrono Cross
////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////
// Nemesis pour Terminus Traduction (tt_nemesis@yahoo.fr)
// Date de création :		30/05/04
// Dernière modification :	30/05/04
////////////////////////////////////////////////////////////////////

// Entete
#include "Patcheur.h"

// Lecture IPS de nb octets dans fich
unsigned int Info_Lecture(FILE *fich, int nb)
{
	int i;
	unsigned int num=0;

	for(i=0;i<nb;i++)
		num=(num<<8)+fgetc(fich);
	return num;
}

/*------------------------------------------------------------------
  Application IPS sur un fichier
--------------------------------------------------------------------
 <- fich : fichier de base sur lequel appliquer
------------------------------------------------------------------*/
JNIEXPORT jint JNICALL Java_Librairie_ips_1appliquer
  (JNIEnv *env, jclass cl, jstring fichier)
{
	const char *fich = env->GetStringUTFChars(fichier,0);

	// Fichier de données
	FILE *dat_f;
	char dat_nom[FICH_MAX];
	// Fichier IPS
	FILE *ips_f;
	char ips_nom[FICH_MAX];
	// Paramètre IPS
	unsigned int p; // (offset sur 32 bits)
	unsigned char l; // (longueur sur 8 bits)
	unsigned char buf[256]; // (buffer de stockage)

	// Ouverture du fichier de données
	sprintf(dat_nom,"%s\\%s",DIR_BASE,fich);
	dat_f=fopen(dat_nom,"r+b");

	// Fichier bien ouvert ?
	if (dat_f==NULL)
		return ERROR_FILE;

	// Ouverture du fichier IPS
	sprintf(ips_nom,"%s%s",dat_nom,IPS_EXT);
	ips_f=fopen(ips_nom,"rb");

	// Fichier existant ?
	if (ips_f==NULL)
		return ERROR_FILE;

	// Lecture des premières infos
	fread(&p,sizeof(p),1,ips_f);
	fread(&l,sizeof(l),1,ips_f);
	// Parcours de l'Ips
	while (feof(ips_f)==0) {
		// Chargement et copie du buffer
		fread(buf,sizeof(char),l,ips_f);
		fseek(dat_f,p,SEEK_SET);
		fwrite(buf,sizeof(char),l,dat_f);
		// Passage à l'élément suivant
		fread(&p,sizeof(p),1,ips_f);
		fread(&l,sizeof(l),1,ips_f);
	}

	// Fermeture
	fclose(dat_f);
	fclose(ips_f);
	// Suppression de l'IPS
	remove(ips_nom);

	return ERROR_NONE;
}
